import { autoUpdater } from "electron-updater";
import { BrowserWindow, Notification } from "electron";
import { webContentSend } from "./web-content-send";
/**
 * -1 检查更新失败 0 正在检查更新 1 检测到新版本，准备下载 2 未检测到新版本 3 下载中 4 下载完成
 **/
class Update {
  public mainWindow: BrowserWindow;

  constructor() {
    // 禁止自动下载
    autoUpdater.autoDownload = false;

    // 禁止关闭程序时安装下载好的安装包
    autoUpdater.autoInstallOnAppQuit = false;

    // 运行开发模式启用update
    autoUpdater.forceDevUpdateConfig = true;

    // 当更新发生错误的时候触发。
    autoUpdater.on("error", (err) => {
      // console.log("更新出现错误", err.message);
      if (err.message.includes("sha512 checksum mismatch")) {
        this.Message(this.mainWindow, -1, "sha512校验失败");
      } else {
        this.Message(this.mainWindow, -2, "错误信息请看主进程控制台");
      }
    });

    // 当开始检查更新的时候触发
    autoUpdater.on("checking-for-update", () => {
      // console.log("开始检查更新");
      this.Message(this.mainWindow, 0);
    });

    // 发现可更新数据时
    autoUpdater.on("update-available", (UpdateInfo) => {
      console.log("有更新");
      this.Message(this.mainWindow, 1);
      this.ShowNotification("更新提示", `version:${UpdateInfo.version}`);
    });

    // 没有可更新数据时
    autoUpdater.on("update-not-available", () => {
      this.Message(this.mainWindow, 2);
    });

    // 下载监听
    autoUpdater.on("download-progress", (progressObj) => {
      const res = {
        percent: progressObj.percent,
        bytesPerSecond: progressObj.bytesPerSecond,
      };
      webContentSend.DownloadProBar(this.mainWindow.webContents, res);
    });

    // 下载完成
    autoUpdater.on("update-downloaded", () => {
      this.Message(this.mainWindow, 4);
    });
  }

  ShowNotification(title: string, body: string) {
    if (!Notification.isSupported()) return;
    const navigator = new Notification({
      title: title,
      body: body,
    });
    navigator.show();
  }

  // 负责向渲染进程发送信息
  Message(mainWindow: BrowserWindow, type: number, data?: string) {
    const senddata = {
      state: type,
      msg: data || "",
    };
    webContentSend.UpdateMsg(mainWindow.webContents, senddata);
  }

  // 执行自动更新检查
  checkUpdate(mainWindow: BrowserWindow) {
    this.mainWindow = mainWindow;
    autoUpdater.checkForUpdates().catch((err) => {
      this.Message(this.mainWindow, -3, err);
    });
  }

  // 下载更新
  downloadUpdate() {
    autoUpdater.downloadUpdate().catch((err) => {
      this.Message(this.mainWindow, -4, err);
    });
  }

  // 退出并安装
  quitAndInstall() {
    autoUpdater.quitAndInstall();
  }
}

export default Update;
